using System;
using JGSY.CMS.LowCode.Platform.Domain.Interfaces;

namespace JGSY.CMS.LowCode.Platform.Domain.Entities
{
    /// <summary>
    /// 发布记录实体
    /// 用于记录内容发布的状态、版本和相关操作信息
    /// </summary>
    public class Publish : ITenantEntity
    {
        /// <summary>
        /// 发布记录标识符
        /// </summary>
        public long Id { get; set; }
        
        /// <summary>
        /// 内容标识符
        /// 被发布的内容项ID
        /// </summary>
        public long ContentId { get; set; }
        
        /// <summary>
        /// 内容信息
        /// 导航属性，指向被发布的内容项
        /// </summary>
        public ContentItem? Content { get; set; }
        
        /// <summary>
        /// 用户标识符
        /// 执行发布操作的用户ID
        /// </summary>
        public long UserId { get; set; }
        
        /// <summary>
        /// 用户信息
        /// 导航属性，指向执行发布操作的用户
        /// </summary>
        public User? User { get; set; }
        
        /// <summary>
        /// 发布状态
        /// 如：草稿(draft)、已发布(published)、已撤回(withdrawn)等
        /// </summary>
        public string Status { get; set; } = "draft";
        
        /// <summary>
        /// 版本号
        /// 内容发布的版本标识，用于版本管理
        /// </summary>
        public int Version { get; set; } = 1;
        
        /// <summary>
        /// 发布时间
        /// 内容实际发布的时间戳
        /// </summary>
        public DateTime? PublishedAt { get; set; }
        
        /// <summary>
        /// 创建时间
        /// 发布记录的创建时间戳
        /// </summary>
        public DateTime CreatedAt { get; set; }
        
        /// <summary>
        /// 操作类型
        /// 如：发布(publish)、撤销(revoke)等操作类型
        /// </summary>
        public string ActionType { get; set; } = string.Empty;
        
        /// <summary>
        /// 操作人员
        /// 执行发布操作的用户标识或姓名
        /// </summary>
        public string Operator { get; set; } = string.Empty;
        
        /// <summary>
        /// 操作时间
        /// 发布或撤销操作执行的时间
        /// </summary>
        public DateTime ActionTime { get; set; }
        
        /// <summary>
        /// 目标环境
        /// 内容发布到的目标环境，如生产环境、测试环境等
        /// </summary>
        public string? TargetEnvironment { get; set; }
        
        /// <summary>
        /// 计划发布时间
        /// 预定的发布时间，为空表示立即发布
        /// </summary>
        public DateTime? ScheduledTime { get; set; }

        /// <summary>
        /// 租户标识符
        /// </summary>
        public string TenantId { get; set; } = string.Empty;
    }
}
